#pragma once

namespace BWAPI {
	namespace Managed {
	
		ref class Game;
		ref class Player;
		ref class Unit;
		value struct Position;
		value struct TilePosition;
		
		public ref class AIModule {
			private:
				System::Configuration::Configuration ^m_Configuration;
				BWAPI::Managed::Game ^m_Game;
				
			public:
				AIModule(System::Configuration::Configuration ^Configuration,
						BWAPI::Managed::Game ^Game);
				virtual void OnStart(void);
				virtual void OnEnd(bool IsWinner);
				virtual void OnFrame(void);
				virtual bool OnSendText(System::String ^Text);
				virtual void OnPlayerLeft(Player ^Player);
				virtual void OnNukeDetect(Position Target);
				virtual void OnUnitCreate(Unit ^Unit);
				virtual void OnUnitDestroy(Unit ^Unit);
				virtual void OnUnitMorph(Unit ^Unit);
				virtual void OnUnitShow(Unit ^Unit);
				virtual void OnUnitHide(Unit ^Unit);
				virtual void OnUnitRenegade(Unit ^Unit);
				
			public:
				property System::Configuration::Configuration ^Configuration {
					System::Configuration::Configuration ^get(void);
				}
				
				property BWAPI::Managed::Game ^Game {
					BWAPI::Managed::Game ^get(void);
				}
		};
	}
}